<!DOCTYPE html>
            <html>
                <head>                    
                    <meta http-equiv="X-UA-Compatible" content="IE=edge">
                    <meta http-equiv="content-type" content="text/html; charset=utf-8">
                    <title>README.md</title>
                    <style type="text/css">
                    /*
Copyright (c) 2017 Chris Patuzzo
https://twitter.com/chrispatuzzo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px;
  color: #333;
}

body &gt; *:first-child {
  margin-top: 0 !important;
}

body &gt; *:last-child {
  margin-bottom: 0 !important;
}

a {
  color: #4183C4;
  text-decoration: none;
}

a.absent {
  color: #cc0000;
}

a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
}

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative;
}

h2:first-child, h1:first-child, h1:first-child + h2, h3:first-child, h4:first-child, h5:first-child, h6:first-child {
  margin-top: 0;
  padding-top: 0;
}

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  text-decoration: none;
}

h1 tt, h1 code {
  font-size: inherit;
}

h2 tt, h2 code {
  font-size: inherit;
}

h3 tt, h3 code {
  font-size: inherit;
}

h4 tt, h4 code {
  font-size: inherit;
}

h5 tt, h5 code {
  font-size: inherit;
}

h6 tt, h6 code {
  font-size: inherit;
}

h1 {
  font-size: 28px;
  color: black;
}

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

h5 {
  font-size: 14px;
}

h6 {
  color: #777777;
  font-size: 14px;
}

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0;
}

/*
hr {
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}
*/
body &gt; h2:first-child {
  margin-top: 0;
  padding-top: 0;
}

body &gt; h1:first-child {
  margin-top: 0;
  padding-top: 0;
}

body &gt; h1:first-child + h2 {
  margin-top: 0;
  padding-top: 0;
}

body &gt; h3:first-child, body &gt; h4:first-child, body &gt; h5:first-child, body &gt; h6:first-child {
  margin-top: 0;
  padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0;
}

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0;
}

li p.first {
  display: inline-block;
}

ul, ol {
  padding-left: 30px;
}

ul :first-child, ol :first-child {
  margin-top: 0;
}

ul :last-child, ol :last-child {
  margin-bottom: 0;
}

dl {
  padding: 0;
}

dl dt {
  font-size: 14px;
  font-weight: bold;
  font-style: italic;
  padding: 0;
  margin: 15px 0 5px;
}

dl dt:first-child {
  padding: 0;
}

dl dt &gt; :first-child {
  margin-top: 0;
}

dl dt &gt; :last-child {
  margin-bottom: 0;
}

dl dd {
  margin: 0 0 15px;
  padding: 0 15px;
}

dl dd &gt; :first-child {
  margin-top: 0;
}

dl dd &gt; :last-child {
  margin-bottom: 0;
}

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777;
}

blockquote &gt; :first-child {
  margin-top: 0;
}

blockquote &gt; :last-child {
  margin-bottom: 0;
}

table {
  padding: 0;
}
table tr {
  border-top: 1px solid #cccccc;
  background-color: white;
  margin: 0;
  padding: 0;
}

table tr:nth-child(2n) {
  background-color: #f8f8f8;
}

table tr th {
  font-weight: bold;
  border: 1px solid #cccccc;
  text-align: left;
  margin: 0;
  padding: 6px 13px;
}

table tr td {
  border: 1px solid #cccccc;
  text-align: left;
  margin: 0;
  padding: 6px 13px;
}

table tr th :first-child, table tr td :first-child {
  margin-top: 0;
}

table tr th :last-child, table tr td :last-child {
  margin-bottom: 0;
}

img {
  max-width: 100%;
}

span.frame {
  display: block;
  overflow: hidden;
}

span.frame &gt; span {
  border: 1px solid #dddddd;
  display: block;
  float: left;
  overflow: hidden;
  margin: 13px 0 0;
  padding: 7px;
  width: auto;
}

span.frame span img {
  display: block;
  float: left;
}

span.frame span span {
  clear: both;
  color: #333333;
  display: block;
  padding: 5px 0 0;
}

span.align-center {
  display: block;
  overflow: hidden;
  clear: both;
}

span.align-center &gt; span {
  display: block;
  overflow: hidden;
  margin: 13px auto 0;
  text-align: center;
}

span.align-center span img {
  margin: 0 auto;
  text-align: center;
}

span.align-right {
  display: block;
  overflow: hidden;
  clear: both;
}

span.align-right &gt; span {
  display: block;
  overflow: hidden;
  margin: 13px 0 0;
  text-align: right;
}

span.align-right span img {
  margin: 0;
  text-align: right;
}

span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left;
}

span.float-left span {
  margin: 13px 0 0;
}

span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right;
}

span.float-right &gt; span {
  display: block;
  overflow: hidden;
  margin: 13px auto 0;
  text-align: right;
}

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
}

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent;
}

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px;
}

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px;
}

pre code, pre tt {
  background-color: transparent;
  border: none;
}

/* Syntax Highlighting */

.plainText {
 background-color: #FFFFFF;
 color: #000000;
}
.htmlServerSideScript {
 background-color: #FFFF00;
}
.htmlComment {
 color: #008000;
}
.htmlTagDelimiter {
 color: #0000FF;
}
.htmlElementName {
 color: #A31515;
}
.htmlAttributeName {
 color: #FF0000;
}
.htmlAttributeValue {
 color: #0000FF;
}
.htmlOperator {
 color: #0000FF;
}
.comment {
 color: #008000;
}
.xmlDocTag {
 color: #808080;
}
.xmlDocComment {
 color: #008000;
}
.string {
 color: #A31515;
}
.stringCSharpVerbatim {
 color: #A31515;
}
.keyword {
 color: #0000FF;
}
.preprocessorKeyword {
 color: #0000FF;
}
.htmlEntity {
 color: #FF0000;
}
.xmlAttribute {
 color: #FF0000;
}
.xmlAttributeQuotes {
 color: #000000;
}
.xmlAttributeValue {
 color: #0000FF;
}
.xmlCDataSection {
 color: #808080;
}
.xmlComment {
 color: #008000;
}
.xmlDelimiter {
 color: #0000FF;
}
.xmlName {
 color: #A31515;
}
.className {
 color: #48D1CC;
}
.cssSelector {
 color: #A31515;
}
.cssPropertyName {
 color: #FF0000;
}
.cssPropertyValue {
 color: #0000FF;
}
.sqlSystemFunction {
 color: #FF00FF;
}
.powershellAttribute {
 color: #B0E0E6;
}
.powershellOperator {
 color: #808080;
}
.powershellType {
 color: #008080;
}
.powershellVariable {
 color: #FF4500;
}
.type {
 color: #008080;
}
.typeVariable {
 color: #008080;
 font-style: italic;
}
.namespace {
 color: #000080;
}
.constructor {
 color: #800080;
}
.predefined {
 color: #000080;
}
.pseudoKeyword {
 color: #000080;
}
.stringEscape {
 color: #808080;
}
.controlKeyword {
 color: #0000FF;
}
.number {
}
.operator {
}
.delimiter {
}
.markdownHeader {
 font-weight: bold;
}
.markdownCode {
 color: #008080;
}
.markdownListItem {
 font-weight: bold;
}
.italic {
 font-style: italic;
}
.bold {
 font-weight: bold;
}

                    </style>
                </head>
                <body style="">
                <h1 id="0">WinCC OA通用低代码库LIB319（及中文包）</h1>
<h1 id="2">0. 前言</h1>
<p id="4">WinCC OA通用低代码库LIB的目的是可以通过简单的几步工作，实现如下的只有专业监控软件才能具备的功能：</p>
<p id="6"><img src="source/media/0734ebb72c5245410f8dae50231c7776.png" alt="" /></p>
<p id="8">当报警发生，右侧导航将能在导航按钮观察到“一级报警”、“二级报警”、“三级报警”不同位置的红色警示点。点击后追寻到报警设备，继续点击弹开设备面板，显示设备详细数据，读、写、报警三个栏是分离的。报警位置可以进行确认。同时，弹窗弹出报警信息，语音播报出来。10s后自动弹窗关闭。</p>
<p id="10">支持被控设备的模型及模型面板</p>
<ul id="12">
<li id="12">点位信息导入（PLC地址、单位、权限、描述、上下限）</li>
<li id="13">画面拓扑、导航、导航菜单、导航框架的自动生成</li>
<li id="14">软件运行环境模板</li>
<li id="15">数值设定、操作的二次弹窗</li>
<li id="16">PLC写数据过程的反读校验</li>
<li id="17">操作日志</li>
<li id="18">设备面板的历史数据曲线、历史操作记录、简单数据报表</li>
<li id="19">实时报警、历史报警、报警条</li>
<li id="20">历史事件查询</li>
<li id="21">动态趋势、固定趋势配置</li>
<li id="22">语音报警、报警弹窗、报警画面</li>
<li id="23">样式表</li>
<li id="24">支持中英文环境</li>
<li id="25">支持后期扩展到冗余、分布式、web客户端等架构</li>
<li id="26">支持最新的WinCC OA 3.19特性，如趋势图的动态采样</li>
<li id="27">自动历史归档配置</li>
</ul>
<p id="29">同时，支持数据看板功能，可实现对服务器、交换机网络、历史数据库（influxDB）等运行工况进行监视。</p>
<p id="31"><img src="source/media/fc6ef2c274b05386585a6227c93cf74b.png" alt="" /></p>
<p id="33">图：历史数据库influxDB运行监控</p>
<p id="35"><img src="source/media/3565ad7ced214ef96cee403764bc6cd6.png" alt="" /></p>
<p id="37">图：系统主机（Windows或Linux）进行监控</p>
<h1 id="39">1. 准备</h1>
<p id="41">需要具有第三方免费代码托管网站 <a href="https://www.gitee.com">https://www.gitee.com</a> 账号。请先注册。</p>
<p id="43">不注册的情况，可以拷贝已经下载了的上述的两个zip，但不确保是最新版本。</p>
<p id="45">基础库LIB319的下载同步</p>
<p id="47"><img src="source/media/b2e2c642e1b418b961ba3e44bb07177c.png" alt="" /></p>
<h2 id="49">1. 新建工程文件夹</h2>
<h3 id="50">1.1 新建LIB319库文件夹</h3>
<blockquote id="52">
<p id="52">C:\WinCC_OA_Proj\LIB319</p>
</blockquote>
<p id="54"><img src="source/media/79fc35da871733d4933aef3b7073671c.png" alt="" /></p>
<h3 id="56">1.2 中文包CN319的下载同步</h3>
<blockquote id="58">
<p id="58">C:\WinCC_OA_Proj\CN319</p>
</blockquote>
<p id="60"><a href="https://gitee.com/zhigangli2020/wincc-oa-chinese/">https://gitee.com/zhigangli2020/wincc-oa-chinese/</a> 下载后解压3.19 中文包到该路径。如下图所示</p>
<p id="62"><img src="source/media/cd311aca0e2a71ff1d3e30373ddb0669.png" alt="" /></p>
<p id="64"><code>config</code>文件举例</p>
<p id="66">host文件存储位置是：</p>
<blockquote id="67">
<p id="67">[WINDOWS]  C:\windows\system32\drivers\etc\hosts<br />
[LINUX]  /etc/hosts</p>
</blockquote>
<p id="70">如果没有此文件，需要手工创建。</p>
<p id="72">服务器主机、备机、客户端、其他与WinCC OA之间相互通讯的主机（如远程驱动的主机等）均需要使用hosts文件，集中存储不易记住和识别的IP地址信息。</p>
<p id="74"><code>hosts</code> 文件的规范:</p>
<pre><code id="76">127.0.0.1 localhost SVR01
::1 localhost SVR01

\# 以下为服务器的IP（举例）
192.168.100.219 SVR01 SVR01-1
192.168.101.219 SVR01-2

192.168.100.220 SVR02 SVR02-1
192.168.101.220 SVR02-2

192.168.100.221 Client01 Client01-1
192.168.101.221 Client01-2

</code></pre>
<p id="91">第一行的 <code>localhost</code>之后，请追加填写当前的主机的名称。（注，每个主机都不一样，请自行修改）。</p>
<p id="93">冗余网络的情况，请将SVR01当作主访问域名，第一个网卡命名SVR01-1当作别名1，第二个网卡SVR01-2当作别名2.</p>
<p id="95">需要将客户端的IP地址也填入。格式如上的Client01</p>
<h2 id="97">2. 新建项目</h2>
<h3 id="99">2.1 新建项目</h3>
<p id="101"><img src="source/media/92c0d21b3809cca11de95931aabf8d94.png" alt="" /></p>
<p id="103">勾选<code>Legacy Standard project</code></p>
<p id="105">使用经典项目。</p>
<p id="107"><img src="source/media/57641feed76bb6e76b8207175d3abda5.png" alt="" /></p>
<blockquote id="109">
<ol start="2" id="109">
<li id="109">输入项目名称。如PEX</li>
<li id="110">按住Ctrl键，多选语言(2 selected)</li>
</ol>
</blockquote>
<ul id="111">
<li id="111">en_US.utf8</li>
<li id="112">zh_CN.utf8</li>
</ul>
<blockquote id="113">
<ol start="4" id="113">
<li id="113">项目路径（请选择固态硬盘所在的磁盘分区）：
<code>C:/WinCC_OA_Proj/</code></li>
<li id="115">勾选 Runnable、Use NGA</li>
</ol>
</blockquote>
<p id="118"><img src="source/media/b6391d0f4fbf9ff13d216886f2eb2f2c.png" alt="" /></p>
<p id="120">选择经典图标模式</p>
<p id="122"><img src="source/media/8e21ba95a36f03a26f028a5802adbd5d.png" alt="" /></p>
<p id="124">不创建root项目管理密码。</p>
<p id="126">注册CN319中文库</p>
<p id="128"><img src="source/media/6ea51ecaf53e10c82e2600b56bdbc3e3.png" alt="" /></p>
<blockquote id="130">
<p id="130">1的位置注册项目<br />
2的位置打开路径<br />
3的位置确认即可</p>
</blockquote>
<p id="134">注册LIB319基础库</p>
<p id="136"><img src="source/media/b2d16731b7511787785459ef30bd54f4.png" alt="" /></p>
<blockquote id="138">
<p id="138">1的位置选择注册项目。<br />
2的位置打开文件夹选择按钮，选择基础库LIB319的文件夹。<br />
3的位置选择文件夹。Runable应该是灰色。</p>
</blockquote>
<p id="142">注册完后的基础库，只有基本素材，不含有数据库，不能当作项目来运行。项目管理器应该看不到。</p>
<h3 id="144">2.2 集成基础库</h3>
<p id="146">将基础库LIB319加入到子项目</p>
<p id="148"><img src="source/media/c3002eaab2063167c8b3bb5657f228a1.png" alt="" /></p>
<p id="150">打开项目管理器,</p>
<blockquote id="152">
<p id="152">1的位置管理项目配置。<br />
2的位置配置子项目集成<br />
3的位置将CN319,LIB319选择到右侧。</p>
</blockquote>
<p id="156">注意：PEX项目的Gedi运行之后，项目管理器应当如下</p>
<p id="158"><img src="source/media/de31ce6d808a23b7c5e5462c7990a124.png" alt="" /></p>
<p id="160">运行项目后，可以在项目管理路径下，发现CN319, LIB319已经被集成当作子库。</p>
<p id="162">项目的<code>config</code>文件应该是这样</p>
<p id="164"><img src="source/media/75ae6a0e9af66914deef4bdd46a484d1.png" alt="" /></p>
<h3 id="166">2.3 初始化LIB参数</h3>
<p id="168">DP点清理</p>
<p id="170"><img src="source/media/aac20305f1310fd05312b02eafe4d55d.png" alt="" /></p>
<p id="172">进入到Gedi开发环境，展开项目后，找到2的位置。</p>
<blockquote id="173">
<p id="173">2的位置找到“删除DP.xml”的按钮</p>
</blockquote>
<p id="175">其功能为：将执行“清除全部DP” 将清除现有的所有DP。（不清除_为前缀的内部DP）。自动“创建DP” 创建_Ui,_Driver等内部需要的DP。</p>
<p id="177">点击运行画面。执行上面的步骤。</p>
<p id="179"><img src="source/media/5c6b41df9ce9994fb87553fe4a00aa86.png" alt="" /></p>
<h3 id="181">2.4 创建S7驱动，</h3>
<p id="182">参数 <code>-num 3</code></p>
<p id="184"><img src="source/media/161aab4a4b878806d104c71ad39471c6.png" alt="" /></p>
<blockquote id="186">
<p id="186">1的位置选择添加Manager<br />
2的位置选择S7 Driver<br />
3的位置输入 -num 3， 注意有空格<br />
4的位置确认<br />
5的位置应当看到运行起来状态是绿色的2.</p>
</blockquote>
<p id="192">注意：</p>
<p id="194">若是危险品、重大资产的调试操作，应当先建立<code>-num 3</code>的simulation driver，不要直接在实际的驱动进行操作！</p>
<p id="196">手工创建占位连接<code>SIEMENSPLC01</code></p>
<p id="198"><img src="source/media/f16635fcf842600ae7812b3d4cf546a9.png" alt="" /></p>
<p id="200">只是为了占位。不激活。</p>
<blockquote id="202">
<p id="202">1的位置打开系统管理。<br />
2的位置找到S7驱动<br />
3的位置创建，输入<code>SIEMENSPLC01</code>，<em>此名称有重要的占位作用，不得起其他的名称。</em><br />
4的位置确认
不要激活驱动，直接点击4，确认即可。</p>
</blockquote>
<h3 id="208">2.5 新建一个PLC连接</h3>
<p id="210">新建实际用的PLC</p>
<p id="212">确保num 3号驱动是S7 Driver Manager,已经在运行</p>
<p id="214"><img src="source/media/148a66df8087ef9aa268eb3c20eba271.png" alt="" /></p>
<p id="216">新建的某个PLC名称：F1_CUB_1_PEX_PLC01</p>
<p id="218"><img src="source/media/8f81cbc2caca87d9218f82d4eae10334.png" alt="" /></p>
<blockquote id="220">
<p id="220">1的位置找到S7驱动管理</p>
<p id="222">2的位置点击新建，输入PLC名：F1_CUB_1_PEX_PLC01。</p>
<p id="224">3的位置输入隶属的驱动的num号，本例为数字3。</p>
<p id="226">4的位置激活“Set Invalid bit”激活无效位</p>
<p id="228">5的位置如果是冗余PLC,S7-400H则勾选冗余设备（如400H）. 如果是单机PLC，不需要勾选。</p>
<p id="230">6的位置输入IP地址。可以是DNS名称或纯IP</p>
<p id="232">7的位置选择“Other”。“其他”指的是S7 PLC具有更多的通讯的资源连接数量。</p>
<p id="234">8的位置为冗余的备机PLC进行设置IP地址等参数。</p>
<p id="236">9的位置激活PLC通讯，同时在State可以查看连接状态是否正常。</p>
</blockquote>
<p id="238">新建对应的模拟驱动</p>
<p id="240"><img src="source/media/0efd42631aaddf71d05e082d7a34d0e4.png" alt="" /></p>
<p id="242">如上图所示：应当在控制台，在</p>
<blockquote id="244">
<p id="244">1的位置S7 Driver 具有相同的-num 号<code>-num 3</code>。</p>
<p id="246">2的位置同时建立一个<code>Simulation Driver</code></p>
</blockquote>
<table id="249">
<thead>
<tr id="249">
<th id="249">必读的重要提示： 导入点位的过程，应当使用<code>Simulation Driver</code>，测试和通讯PLC的过程及生产过程，应当使用<code>S7 Driver</code>；或者将PLC的激活勾选项设置为禁用。 这是因为导入点位的过程，很可能会将DO, AO等执行指令下发给PLC，导致PLC的设备动作，这是极其危险的，应当不能用真实的S7 Driver，而是替代<code>Simulation Driver</code>来实现。<code>Simulation Driver</code>将只是用于配置地址信息等数据，不会做出任何与PLC的读写通讯。</th>
</tr>
</thead>
</table>
<h2 id="252">3 导入点位</h2>
<h3 id="253">3.1 导入 LIB.dpl 点表基础模型</h3>
<p id="255">将LIB319的<code>C:\WinCC_OA_Proj\LIB319\dplist\LIB.dpl</code>用notepad++打开，替换里面的<code>DUMMY</code>字段，本例替换为项目名称<code>PEX</code>。</p>
<p id="257"><img src="source/media/b9c5a70ac023df4a3ca56d0099aff407.png" alt="" /></p>
<p id="259">然后再导入LIB.dpl，</p>
<p id="261"><img src="source/media/7b2f5cb6b9148daa9a0011180c18f0d3.png" alt="" /></p>
<blockquote id="263">
<p id="263">1的位置打开ASCII manager导入工具</p>
<p id="265">2打开按钮，浏览文件。</p>
<p id="267">3的位置，选择库LIB319的dplist文件夹</p>
<p id="269">4选择修改了的LIB.dpl</p>
<p id="271">5勾选自动更新DP 类型、导入报警属性。</p>
</blockquote>
<h3 id="273">3.2 拷贝点位模板</h3>
<p id="275">拷贝库点位原始模板的文件夹</p>
<blockquote id="277">
<p id="277">LIB319\data\dp\DUMMY\</p>
</blockquote>
<p id="279">到项目文件夹的对应路径下。 应当有如下例子的文件路径：</p>
<blockquote id="281">
<p id="281">C:\WinCC_OA_Proj\PEX\data\dp\<strong>PEX</strong>\F1_CUB_1_<strong>PEX</strong>_PLC01\01_VFD.txt</p>
</blockquote>
<p id="283">将其中文件夹路径、PLC命名、文本文件里面的<code>DUMMY</code>全部替换为<code>PEX</code>.</p>
<p id="285"><img src="source/media/e0b7885bef7b3bd13810741be4c8b7ca.png" alt="" /></p>
<p id="287">项目路径下，如1的位置、</p>
<blockquote id="288">
<p id="288">2的位置，都把<code>DUMMY</code>换成了<code>PEX</code></p>
</blockquote>
<h3 id="290">3.3 编辑点位</h3>
<p id="292">示例01_VFD.txt存储的是用于某个PEX项目的变频调节器（如变频泵等）模板。</p>
<p id="294">用notepad++打开。</p>
<p id="296">可以复制文本粘贴到Excel编辑。Excel必须在使用前，对全部单元格进行格式化成text纯文本格式。否则将自动进行格式化，再进行粘贴操作，否则会出现一些不可预知的错误。</p>
<table id="298">
<thead>
<tr id="298">
<th id="298">项目</th>
<th id="298">描述</th>
<th id="298">单位</th>
<th id="298">格式</th>
<th id="298">量程L</th>
<th id="298">量程H</th>
<th id="298">报警死区</th>
<th id="298">高高报警限值设定</th>
<th id="298">高报警限值设定</th>
<th id="298">低报警限值设定</th>
<th id="298">低低报警限值设定</th>
<th id="298">高高报警使能</th>
<th id="298">高报警使能</th>
<th id="298">低报警使能</th>
<th id="298">低低报警使能</th>
<th id="298">仪表下限</th>
<th id="298">仪表上限</th>
<th id="298">过程值</th>
<th id="298">仪表故障</th>
<th id="298">高高报警</th>
<th id="298">高报警</th>
<th id="298">低报警</th>
<th id="298">低低报警</th>
<th id="298">占位</th>
</tr>
</thead>
<tbody>
<tr id="300">
<td id="300">字段1</td>
<td id="300"></td>
<td id="300"></td>
<td id="300"></td>
<td id="300"></td>
<td id="300"></td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">CMD</td>
<td id="300">STATE</td>
<td id="300">ERROR</td>
<td id="300">ERROR</td>
<td id="300">ERROR</td>
<td id="300">ERROR</td>
<td id="300">ERROR</td>
<td id="300">占位</td>
</tr>
<tr id="301">
<td id="301">字段2</td>
<td id="301"></td>
<td id="301"></td>
<td id="301"></td>
<td id="301"></td>
<td id="301"></td>
<td id="301">DEADBAND</td>
<td id="301">HH_SP</td>
<td id="301">H_SP</td>
<td id="301">L_SP</td>
<td id="301">LL_SP</td>
<td id="301">HH_EN</td>
<td id="301">H_EN</td>
<td id="301">L_EN</td>
<td id="301">LL_EN</td>
<td id="301">LOW_SPAN</td>
<td id="301">HIGH_SPAN</td>
<td id="301">VAL_IN</td>
<td id="301">ALM</td>
<td id="301">HH_ALM</td>
<td id="301">H_ALM</td>
<td id="301">L_ALM</td>
<td id="301">LL_ALM</td>
<td id="301">占位</td>
</tr>
<tr id="302">
<td id="302">数据类型</td>
<td id="302"></td>
<td id="302"></td>
<td id="302"></td>
<td id="302"></td>
<td id="302"></td>
<td id="302">AO</td>
<td id="302">AO</td>
<td id="302">AO</td>
<td id="302">AO</td>
<td id="302">AO</td>
<td id="302">DO</td>
<td id="302">DO</td>
<td id="302">DO</td>
<td id="302">DO</td>
<td id="302">AO</td>
<td id="302">AO</td>
<td id="302">AI</td>
<td id="302">DI</td>
<td id="302">DI</td>
<td id="302">DI</td>
<td id="302">DI</td>
<td id="302">DI</td>
<td id="302">占位</td>
</tr>
<tr id="303">
<td id="303">报警等级</td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303"></td>
<td id="303">二级报警</td>
<td id="303">一级报警</td>
<td id="303">二级报警</td>
<td id="303">二级报警</td>
<td id="303">一级报警</td>
<td id="303">占位</td>
</tr>
<tr id="304">
<td id="304">操作权限</td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304">6</td>
<td id="304">7</td>
<td id="304">7</td>
<td id="304">7</td>
<td id="304">7</td>
<td id="304">6</td>
<td id="304">6</td>
<td id="304">6</td>
<td id="304">6</td>
<td id="304">7</td>
<td id="304">7</td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304"></td>
<td id="304">占位</td>
</tr>
<tr id="305">
<td id="305">F1_CUB_1_1_102_XF_TIT01</td>
<td id="305">CUB_1_1_102_XF_TIT01消防泵房温度检测</td>
<td id="305">℃</td>
<td id="305">%4.2f</td>
<td id="305">0</td>
<td id="305">100</td>
<td id="305">DB2395.DBD68</td>
<td id="305">DB2395.DBD72</td>
<td id="305">DB2395.DBD76</td>
<td id="305">DB2395.DBD80</td>
<td id="305">DB2395.DBD84</td>
<td id="305">DB2395.DBX96.0</td>
<td id="305">DB2395.DBX96.1</td>
<td id="305">DB2395.DBX96.2</td>
<td id="305">DB2395.DBX96.3</td>
<td id="305">DB2398.DBD8</td>
<td id="305">DB2398.DBD4</td>
<td id="305">DB2395.DBD142</td>
<td id="305">DB2395.DBX114.0</td>
<td id="305">DB2395.DBX156.0</td>
<td id="305">DB2395.DBX156.1</td>
<td id="305">DB2395.DBX156.2</td>
<td id="305">DB2395.DBX156.3</td>
<td id="305">占位</td>
</tr>
<tr id="306">
<td id="306">F1_CUB_1_CUB_RO_FQIT01</td>
<td id="306">CUB西南侧纯水流量检测</td>
<td id="306">m³/h</td>
<td id="306">%4.2f</td>
<td id="306">0</td>
<td id="306">100</td>
<td id="306">DB1554.DBD68</td>
<td id="306">DB1554.DBD72</td>
<td id="306">DB1554.DBD76</td>
<td id="306">DB1554.DBD80</td>
<td id="306">DB1554.DBD84</td>
<td id="306">DB1554.DBX96.0</td>
<td id="306">DB1554.DBX96.1</td>
<td id="306">DB1554.DBX96.2</td>
<td id="306">DB1554.DBX96.3</td>
<td id="306">DB1557.DBD8</td>
<td id="306">DB1557.DBD4</td>
<td id="306">DB1554.DBD142</td>
<td id="306">DB1554.DBX114.0</td>
<td id="306">DB1554.DBX156.0</td>
<td id="306">DB1554.DBX156.1</td>
<td id="306">DB1554.DBX156.2</td>
<td id="306">DB1554.DBX156.3</td>
<td id="306">占位</td>
</tr>
<tr id="307">
<td id="307">F1_CUB_1_WT_CW_FQIT01</td>
<td id="307">CUB市政补水流量检测</td>
<td id="307">m³/h</td>
<td id="307">%4.2f</td>
<td id="307">0</td>
<td id="307">100</td>
<td id="307">DB1586.DBD68</td>
<td id="307">DB1586.DBD72</td>
<td id="307">DB1586.DBD76</td>
<td id="307">DB1586.DBD80</td>
<td id="307">DB1586.DBD84</td>
<td id="307">DB1586.DBX96.0</td>
<td id="307">DB1586.DBX96.1</td>
<td id="307">DB1586.DBX96.2</td>
<td id="307">DB1586.DBX96.3</td>
<td id="307">DB1589.DBD8</td>
<td id="307">DB1589.DBD4</td>
<td id="307">DB1586.DBD142</td>
<td id="307">DB1586.DBX114.0</td>
<td id="307">DB1586.DBX156.0</td>
<td id="307">DB1586.DBX156.1</td>
<td id="307">DB1586.DBX156.2</td>
<td id="307">DB1586.DBX156.3</td>
<td id="307">占位</td>
</tr>
<tr id="308">
<td id="308">F1_CUB_1_WT_CWS_FQIT01</td>
<td id="308">CUB冷却塔补水泵流量检测</td>
<td id="308">m³/h</td>
<td id="308">%4.2f</td>
<td id="308">0</td>
<td id="308">100</td>
<td id="308">DB1546.DBD68</td>
<td id="308">DB1546.DBD72</td>
<td id="308">DB1546.DBD76</td>
<td id="308">DB1546.DBD80</td>
<td id="308">DB1546.DBD84</td>
<td id="308">DB1546.DBX96.0</td>
<td id="308">DB1546.DBX96.1</td>
<td id="308">DB1546.DBX96.2</td>
<td id="308">DB1546.DBX96.3</td>
<td id="308"></td>
<td id="308"></td>
<td id="308">DB1546.DBD142</td>
<td id="308">DB1546.DBX114.0</td>
<td id="308">DB1546.DBX156.0</td>
<td id="308">DB1546.DBX156.1</td>
<td id="308">DB1546.DBX156.2</td>
<td id="308">DB1546.DBX156.3</td>
<td id="308">占位</td>
</tr>
</tbody>
</table>
<p id="310">按上述格式，填写数据，修改地址等。参见<code>导入dp点的标准格式.xlsx</code></p>
<ul id="312">
<li id="312"><p id="312">蓝色部分是手工填入的点位汉字描述。</p>
</li>
<li id="314"><p id="314">橙色部分是手工填入的PLC地址。允许为空。</p>
</li>
</ul>
<p id="316">Excel编辑点位设计规范：</p>
<ul id="318">
<li id="318">字段1的规范：只允许 CMD,STATE,ERROR这三种</li>
<li id="319">字段2的规范：只允许大写字母与下划线</li>
<li id="320">数据类型的规范：只允许AI，AO，DI，DO，WORD，DWORD，PULSE_OPEN,PULSE_CLOSE这几种。</li>
<li id="321">报警等级规范：只允许一级报警、二级报警、三级报警这三种</li>
<li id="322">操作权限：只允许填写6，7 这两个；6代表一般操作启停控制；7代表参数修改。</li>
<li id="323">最后一列必须是“占位”单元格。</li>
<li id="324">地址不希望存在、无效、都可用将地址单元格留空。</li>
<li id="325">模拟量的格式：%4.2f 代表4个整数，2个小数。</li>
<li id="326">DP设备点命名只允许有大写，下划线。</li>
<li id="327">暂不支持“AI报警”点位的快速导入。需要手工建立。</li>
</ul>
<p id="329">修改完后，将字段拷贝重新贴回到01.VFD.txt</p>
<h3 id="331">3.4 导入S7点位</h3>
<p id="333"><img src="source/media/171e7b6db48def6174507b19f3ec6189.png" alt="" /></p>
<p id="335">在GEDI环境修改基础库LIB319路径下的<code>panels/tools/导入点位工具.xml</code>的源码，适配这个01.VFD.txt</p>
<p id="337">打开“自动创建 DP TYPE”按钮，修改main函数之前的几行，如VFD的设备，改完之后如下：</p>
<div id="338" class="lang-c editor-colors"><div class="cplusplus"><pre>
string path = getPath( DATA_REL_PATH ) + <span class="string">&quot;dp/PEX/F1_CUB_1_PEX_PLC01/01_VFD.txt&quot;</span>; <span class="comment">// !!! 读取文件路径</span>
string dpType = <span class="string">&quot;FMCS_PEX_VFD&quot;</span>;  <span class="comment">// !!! 改DP类型的名称 </span>
string  SubSystemPrefix = <span class="string">&quot;PEX&quot;</span>; <span class="comment">// ATOM 点位的前缀，组合后应当为：LIB_ATOM_MEP_AI_S7, LIB_ATOM_MEP_DI_S7</span>
string PLCType= <span class="string">&quot;S7&quot;</span>; <span class="comment">// 可能选项： S7, MODBUS, AB,OMRON...</span>
</pre></div>
</div>
<p id="345">主要是文件路径，DP类型，子系统前缀名称(MEP,CR,UPW,WWT…), PLC类型（S7,MODBUS,AB…）</p>
<p id="347">复制两个按钮出来，进行修改代码。分别执行两个按钮，将会在日志有所提示。</p>
<blockquote id="349">
<ol start="2" id="349">
<li id="349">自动创建DPTYPE.</li>
<li id="350">自动创建DP</li>
</ol>
</blockquote>
<p id="352">注意：按钮一旦修改代码完成并导入数据，最好不要删除，以便将来再次复查修改和追踪原因。</p>
<p id="354"><img src="source/media/24172d326a3ceb88ffe91cb196ad3157.png" alt="" /></p>
<blockquote id="356">
<p id="356">1的位置点击右键，编辑类型，</p>
<p id="358">2的位置查看结构是否与TXT文本文件定义的结构完全一致。</p>
<p id="360">3的位置检查是否正确引用了ATOM的类型。</p>
</blockquote>
<p id="362"><img src="source/media/7624604264a2a4a01b40ebd9e3e5f0a1.png" alt="" /></p>
<p id="364">如果DP TYPE创建正常，则执行</p>
<blockquote id="365">
<p id="365">4，5。。。自动创建该类型的DP点位。</p>
</blockquote>
<p id="367"><img src="source/media/563be85ac0d3c77c194e5332ab34ef7f.png" alt="" /></p>
<p id="369">若提示导入的点位是“OK”，则证明导入的点位、地址和txt文本文件的校验是基本上没有问题的，但也必须要辅助进行人工复查多次检验，进行最后的确认。</p>
<h3 id="371">3.5 导入Modbus点位</h3>
<p id="373">示例表格：</p>
<blockquote id="375">
<p id="375">C:\WinCC_OA_Proj_319\LIB319\data\dp\DUMMY\Mod_Plc_1\06_AI.txt</p>
</blockquote>
<p id="377">拷贝到项目路径，示例：<code>&lt;项目路径&gt;\data\dp\PEX\Mod_Plc_3\06_AI.txt</code>, 用Notepad++打开，拷贝全部字符，到Excel粘贴。Excel表格在使用前，需将全部单元格格式化为字符，否则地址信息带有.0后缀的会出错。</p>
<p id="379">按前文所述，编辑字段1，字段2，地址表。地址表的格式：</p>
<p id="381"><code>M.3.3.68.0</code></p>
<p id="383"><code>M.PLCId.FunctionCode.ReferenceAddress.Offset</code></p>
<p id="385">PLCId: 在WinCC OA中建立的modbus驱动的ID号。一般一个driver可以带若干个Modbus PLC（<code>PLCId</code>）， 用不同的PLCId进行区分。</p>
<p id="387"><code>PLCId</code>: Modbus PLC的ID号，一般是1开始的数字，在配置Modbus PLC IP地址的界面来获得。</p>
<p id="389"><code>FunctionCode</code>：功能码，如3代表读4x0000区的寄存器地址。</p>
<p id="391"><code>ReferenceAddress</code>：基准地址。</p>
<p id="393"><code>Offset</code>：偏移的bit位，仅对只读的bool量有意义。其他类型都写0</p>
<p id="395">上述地址不得缺失信息，必须包含四个”.”。</p>
<p id="397">将<code>LIB319/dplist/LIB_MODBUS.dpl</code>通过ASCII manager导入到系统。</p>
<p id="399"><img src="source/media/0a36dd9102aa710209555d6f6a2835bb.png" alt="" /></p>
<blockquote id="401">
<p id="401">1，2的位置选择LIB_MODBUS.dpl</p>
</blockquote>
<blockquote id="403">
<p id="403">3的位置勾选自动更新类型和导入报警属性。</p>
</blockquote>
<p id="405">然后观察是否已经导入了ATOM类型的Modbus基础类型点位：</p>
<p id="407"><img src="source/media/793dd249a5f76863fc10a3ab1681f8b0.png" alt="" /></p>
<p id="409">然后，编辑完点位清单，打开<code>LIB319/tools/LIB_DPImportTool_Modbus.xml</code>，对DPTYPE, DP导入的按钮进行适配。</p>
<p id="411"><img src="source/media/0e8aa7873b7d1c173593e770a696b5c0.png" alt="" /></p>
<p id="413">如上图，DP TYPE按钮的修改，将路径、dpType名称，SubSystemPrefix，PLCType进行匹配。执行后即可得到</p>
<p id="415">FMCS_PEX_AI_MODBUS的类型。继续下一步导入点位。</p>
<p id="417"><img src="source/media/a093c4959aac8c701ec3a14f9f526568.png" alt="" /></p>
<blockquote id="419">
<p id="419">1的位置调整路径。</p>
<p id="421">2的位置调整位PEX对应的dpType</p>
<p id="423">3的位置调整PLC的PLCId的序号。</p>
<p id="425">4的位置输入驱动 -num 的号码。通常Modbus从13开始比较好。（1，2预留。3~10预留给S7 驱动，11，12，是Modbus仿真和测试的驱动号）。</p>
<p id="427">5的位置如果是true，则完全重新建立DP，进行地址覆盖（会丢失历史数据）。如果是false，将不对现有的dp进行覆盖。</p>
</blockquote>
<h2 id="429">4 编辑开发画面对象</h2>
<h3 id="431">4.1  设备建模概述</h3>
<p id="433">以这个设备对象FMCS_CR_PUMP为例</p>
<p id="435">点位点表：</p>
<p id="437"><img src="source/media/eaf6b4772bb92012a4b046eb52d7dbca.png" alt="" /></p>
<p id="439">将点表转换为设备数据模型：</p>
<p id="441"><img src="source/media/f4dc5148d5d8531a992793e1f2dbc8c2.png" alt="" /></p>
<p id="443">配置各个点位的参数、属性。</p>
<p id="445">将模型进行实例化。相同的属性，设置为继承自设备模型的配置，无需再次编辑。不同的属性，如地址，配置成可修改的模式，后期进行批量修改。</p>
<p id="447"><img src="source/media/73628573ed3920b610e0e529533ff590.png" alt="" /></p>
<p id="449"><img src="source/media/e6acaacb9098635cb4cbdc0abac6f08b.png" alt="" /></p>
<p id="451">上图描述了实例化和自动继承的关系。</p>
<p id="453">画面建模</p>
<p id="455">panels 文件夹下，一级文件夹必须为</p>
<p id="457"><code>MEP_SYS</code></p>
<p id="459">其中<strong>MEP</strong>是子系统的名称。MEP_SYS文件夹存储全部的PEX的项目画面。将LIB 319的示例面板、示例设备对象（AI,PUMP…）等拷贝到项目的panels路径下，更改文件夹名称为XXX_SYS,XXX为项目名称，如<strong>PEX</strong>_SYS</p>
<p id="461"><img src="source/media/59036379a6048180478632761ede5489.png" alt="" /></p>
<p id="463">使用Notepad++对<code>MEP_SYS</code>的整个文件夹进行文本替换</p>
<p id="465"><img src="source/media/124421c3f591063351b4ab89c28180cc.png" alt="" /></p>
<p id="467">选择文件查找替换的窗口，输入项目文件夹路径，对字符串MEP，全部替换为PEX.然后对文件夹结构进行编辑。</p>
<p id="469">文件夹结构规范：</p>
<p id="471"><img src="source/media/7b144e257677ff49fe215c96df80b1ef.png" alt="" /></p>
<p id="473">在<code>PEX</code>项目的<code>panels/PEX_SYS</code>文件夹下，CUB_1.xml, CUB_2.xml是同名的文件夹CUB_1, CUB_2的索引。里面只摆放导航画面。</p>
<p id="475">CUB_1、CUB_2文件夹下，需要具体存放一些设备、工艺的画面。用规范化的命名进行文件命名。如上图。</p>
<blockquote id="477">
<p id="477">1的位置是PEX_SYS</p>
<p id="479">2的位置是CUB_1.xml 及同名的CUB_1文件夹。同名的索引文件将会在PT.xml自动生成。</p>
<p id="481">3的位置是CUB_1文件夹内部的设备。</p>
</blockquote>
<p id="483">支持多层文件夹嵌套，但一定要在每个层面的文件夹用上面的规范（文件夹及同名.xml的索引文件）进行设计文件夹结构。不得使用中文、异形字符、空格。只允许下划线、首字母。</p>
<h3 id="485">4.2 拓扑文件夹编辑</h3>
<p id="487"><img src="source/media/fffc7892ff3471d4574143549f8902c2.png" alt="" /></p>
<p id="489">打开<code>LIB319/tools/PT.xml</code>,</p>
<p id="491">将源码中出现MEP_SYS的地方，替换成PEX_SYS,保存点击运行。（可以在Notepad++打开PT.xml批量将MEP替换为PEX）。<br />
<img src="source/media/c0ae6c12588dd5ba1e1f7e756b954868.png" alt="" /></p>
<p id="494">在第141行左右，需要过滤掉的文件夹的列表。这里要改一下文件夹名称字符串进行过滤。改造后：</p>
<p id="496"><img src="source/media/f3dcfc5d11bebd5c56f9ac93ce29ee4e.png" alt="" /></p>
<p id="498"><img src="source/media/639e73546101ba619a74321abab53a2a.png" alt="" /></p>
<p id="500">打开拓扑编辑。</p>
<blockquote id="501">
<p id="501">1的位置打开</p>
</blockquote>
<blockquote id="503">
<p id="503">2的位置查看展开后和文件夹是否完全一致。每个画面节点和xml文件有无准确匹配。</p>
</blockquote>
<p id="505"><img src="source/media/75fced8786e41c498f81cd4e5a059cef.png" alt="" /></p>
<blockquote id="507">
<p id="507">1的位置点击报警等级范围</p>
</blockquote>
<blockquote id="509">
<p id="509">2的位置分别点击LIB_Alert_Level1,LIB_Alert_Level2，LIB_Alert_Level3，确认</p>
</blockquote>
<p id="511">此时会更新下面的内部点<code>_SumAlertPanel</code>的DP结构。</p>
<p id="513"><img src="source/media/757ceb2fd29340401f0f7d52c89166b9.png" alt="" /></p>
<h3 id="515">4.3 拓扑模板</h3>
<p id="517"><img src="source/media/72f3b7087978edad2d0edbce3d10031f.png" alt="" /></p>
<blockquote id="519">
<p id="519">1的位置编辑默认的模板。</p>
<p id="521">2选择LIB</p>
<p id="523">3选择高级配置</p>
<p id="525">4选择手动，1920x1080</p>
<p id="527">5 确认。</p>
</blockquote>
<p id="529">修改模型的REFERENCE</p>
<p id="531">如果前面步骤尚未使用Notepad++批量对PEX_SYS文件夹里面的文件出现MEP的地方进行替换成PEX，可以手动进行如下的步骤：</p>
<p id="533">拷贝库的<code>LIB319/MEP_SYS/MEP_M</code>文件夹到项目的PEX_SYS路径下。</p>
<p id="535"><img src="source/media/fe3690c40676f103a207989483679ff6.png" alt="" /></p>
<p id="537">1打开<code>icon_AI/REFERENCE.xml</code>, 双机3的位置，</p>
<p id="539"><img src="source/media/b7f2be9489ce820375ed39694ce7f8d7.png" alt="" /></p>
<p id="541">修改为这个点位的DPTYPE Name：<code>FMCS_PEX_AI</code></p>
<p id="543"><img src="source/media/17bdebde67c18131e12f7a29e06e6ed5.png" alt="" /></p>
<blockquote id="545">
<p id="545">1的位置打开AI.xml</p>
<p id="547">2的位置空白位置点击后，找到属性“参考文件”，打开，找到项目路径下的REFERENCE.xml，上个小节已经修改过该文件。</p>
</blockquote>
<p id="549">保存。</p>
<p id="551">其他的PUMP,VALVE,FAN, PID, VFD….等所有的设备画面，都照此方法调整和保存。</p>
<h3 id="553">4.4 编辑开发画面</h3>
<p id="555"><img src="source/media/79a5134ce78e90f3bd21f3c63f81b667.png" alt="" /></p>
<blockquote id="557">
<p id="557">1的位置找到AI.xml， 代表模拟量仪表监控的设备对象。</p>
<p id="559">拖放到2的位置。</p>
<p id="561">3观察是否为设定的FMCS_PEX_AI的设备模型</p>
<p id="563">4自动拆分字段，快速找到分组</p>
<p id="565">5选择DP点位。</p>
<p id="567">6确定保存画面</p>
</blockquote>
<h3 id="569">4.5 导航配置及拓扑自动报警汇总</h3>
<blockquote id="570">
</blockquote>
<p id="571"><img src="source/media/b84b7a61bc23e2cb62870bec76a9acd0.png" alt="" /></p>
<blockquote id="572">
<p id="573">1的位置打开CUB_1.xml,</p>
<p id="575">2的位置若没有导航按钮，就复制一个。</p>
<p id="577">双机后，3的位置选择被索引的画面节点。</p>
</blockquote>
<p id="579">然后：</p>
<p id="581"><img src="source/media/82e4a4987ca9ce439b77815a23331999.png" alt="" /></p>
<p id="583">当每次将画面、拓扑文件夹自动创建之后，都需要按步骤生成自动汇总报警</p>
<blockquote id="585">
<p id="585">1的位置打开拓扑编辑</p>
<p id="587">2的位置点击全部树节点</p>
<p id="589">3，4的位置保存和检查</p>
</blockquote>
<h3 id="591">4.6 配置右侧导航栏</h3>
<p id="593"><img src="source/media/af2f22a20affb66c6da7e71dc47500a0.png" alt="" /></p>
<blockquote id="596">
<p id="596">1的位置搜索1920，找到naviPanel</p>
<p id="598">2 的位置找到打开</p>
<p id="600">3的位置双机导航按钮，选择被导航的索引的位置。保存画面。</p>
</blockquote>
<h2 id="604">5 客户端、冗余、分布式系统及工程项目配置</h2>
<h3 id="606">5.1 冗余服务器系统配置</h3>
<p id="608">冗余主机、备机文件夹路径、项目文件名通常完全100%的一致。首次部署冗余备机时候可以手动复制项目文件。</p>
<p id="610"><strong>config文件添加：</strong></p>
<pre><code id="611">data = &quot;SVR01-1,SVR01-2$SVR02-1,SVR02-2&quot;
event = &quot;SVR01-1,SVR01-2$SVR02-1,SVR02-2&quot;
</code></pre>
<p id="616"><strong>console控制台添加：</strong></p>
<pre><code id="617">Redundancy Manager
Split Mode Manager
</code></pre>
<h3 id="621">5.2 冗余客户机的配置：</h3>
<p id="623">前提条件：配置好客户端hosts、计算机名、IP地址，搭建好SVN的库版本管理客户端。</p>
<p id="625">与服务器一样，将CN319,LIB319拷贝或同步到客户端的项目文件夹。不建议合并此两个文件夹。</p>
<p id="627">建议将项目的其他的项目的静态的画面、颜色、图片、程序脚本、建成一个<strong>SVN的库</strong>，使用SVN同步来完成，实现版本管理。</p>
<p id="629">通过拷贝文件方式</p>
<p id="631">将<code>&lt;LIB319&gt;/source/客户端项目模板</code>文件夹改名（如 OS1），拷贝到客户端的项目文件夹下。
<img src="source/media/ui_client.png" alt="" /></p>
<p id="634">注册到WinCC OA，并配置CN319,LIB319库,项目库的依赖，注意顺序不要反。</p>
<p id="636">修改&lt;客户端项目&gt;/config/config文件，配置</p>
<pre><code id="637">data = &quot;SVR01-1,SVR01-2$SVR02-1,SVR02-2&quot;
event = &quot;SVR01-1,SVR01-2$SVR02-1,SVR02-2&quot;
</code></pre>
<p id="641">使得能够通过网络连接到服务器。此时即可启动
如果客户机有contrl 脚本用ctrl Manager运行，需要在config文件添加</p>
<blockquote id="643">
<p id="643">[ctrl_2]<br />
connectToRedundantHosts=1</p>
</blockquote>
<p id="646">其中ctrl_2代表<code>-num 2</code> 的contrl manager。</p>
<h3 id="649">5.3 分布式系统配置</h3>
<p id="651">在子节点(或分布式中央节点)修改项目config文件</p>
<pre><code id="652">
[dist]

maxSystemsToInitialize = 0 # 0,unlimit

maxUpdateMsgCount = 400000

requestIdDelay = 100

distPeer = &quot;SVR01-1,SVR01-2\$SVR02-1,SVR02-2&quot; 3
</code></pre>
<p id="665">修改红色字体适配到实际项目。</p>
<p id="667">在console添加<code>Distribution Manager</code></p>
<p id="669">在<code>LIB319/SYSTEM_ID.bat</code>,用记事本打开里面的代码行，</p>
<blockquote id="671">
<p id="671">C:\Siemens\Automation\WinCC_OA\3.19\bin\WCCOAtoolSyncTypesSQLite.exe -system 1 MEP -proj &quot;FMCS_MEP_319&quot;</p>
</blockquote>
<p id="673">修改上面的变量参数适配到实际项目。</p>
<h3 id="675">5.4 重新设定报警筛选条件</h3>
<p id="677">实时报警、历史报警的筛选</p>
<p id="679"><img src="source/media/ca465f0d92f5a408b7f6e010e4246de1.png" alt="" /></p>
<blockquote id="681">
<p id="681">1的位置打开报警、事件、画面配置与编辑</p>
<p id="683">2的位置选择预配好的，如LIB_OnlineAlert</p>
<p id="685">3的位置选择设定</p>
</blockquote>
<p id="687"><img src="source/media/b26a38b85d0251c794e8fa2170cde248.png" alt="" /></p>
<p id="689">在弹窗中，找到过滤系统，找到要显示的分布式系统，点击“显示”，激活此系统的显示。或者点击“所有可用的系统”。</p>
<h3 id="691">5.5 报警条的筛选</h3>
<p id="693"><img src="source/media/ce024f6020621d26d494215b9be6b30b.png" alt="" /></p>
<blockquote id="695">
<p id="695">1的位置点击“编辑报警条”，在设定页面与上文相同进行参数设定。</p>
</blockquote>
<h2 id="697">6 版本管理SVN</h2>
<p id="699">通常是运行在版本管理服务器上做版本管理服务的软件。</p>
<p id="701">主机、备机、OS客户端、工程师站都与版本管理服务器做版本同步。</p>
<p id="703">地址格式举例：https://SVR01:10443/svn/MEP/</p>
<p id="705">集成到Gedi</p>
<p id="707">将<code>&lt;LIB319&gt;/config/config.level</code> 用文本工具打开，拷贝下面这段</p>
<pre><code id="708">[ui]
versionControl = &quot;SVN&quot; \# 默认使用SVN进行版本管理
versionControlDiff = &quot;C:/Program Files/TortoiseSVN/bin/TortoiseUDiff.exe&quot; \# 默认使用SVN进行版本管理，客户端的默认路径
</code></pre>
<p id="713">到项目的config 文件，以便于Gedi可以使用SVN的环境。否则只能在Windows文件夹进行SVN管理。</p>
<p id="715">集成到运行系统</p>
<p id="717"><img src="source/media/1aac3d120619fa962b0b93f0a58797c0.png" alt="" /></p>
<p id="719">使用LIB的库模板，会在下方的工具栏多一个“自动版本更新”的切换开关。鼠标悬停后，可以弹出窗口显示当前的项目（支持多个层级）的库的版本信息。当切换到自动更新模式，将会在后台以10s为周期自动更新SVN服务器的项目版本到本地硬盘。</p>
<p id="721">备份与恢复influxDB数据库</p>
<h2 id="723">7 influxDB的备份与恢复</h2>
<h3 id="725">7.1 备份</h3>
<blockquote id="727">
<p id="727">C:\Siemens\Automation\WinCC_OA\3.19\data\NGA\InfluxDB\sql&gt;backupInfluxDB.cmd --help</p>
</blockquote>
<pre><code id="728">Usage: backupInfluxDB.cmd [\&lt;command\&gt; \&lt;argument\&gt;] \&lt;InfluxDB-backup-path\&gt;

The commands are:

\--database The name of the database (default is &quot;winccoa&quot;)

\--host Host and port of the database (default is &quot;127.0.0.1:8088&quot;)

\--max-backup-count Number of backups kept (default is 3)
</code></pre>
<p id="740">示例：</p>
<blockquote id="742">
<p id="742">C:\Siemens\Automation\WinCC_OA\3.19\data\NGA\InfluxDB\sql&gt;backupInfluxDB.cmd --database winccoa --host localhost:8088 d:\influxdb_backup</p>
<p id="744">2023/07/15 00:33:37 backing up metastore to d:\influxdb_backup\20230715-003337\meta.00</p>
<p id="746">2023/07/15 00:33:38 backing up db=winccoa</p>
<p id="748">2023/07/15 00:33:38 backing up db=winccoa rp=ALERT shard=3 to d:\influxdb_backup\20230715-003337\winccoa.ALERT.00003.00 since 0001-01-01T00:00:00Z</p>
</blockquote>
<h3 id="750">7.2 恢复</h3>
<blockquote id="752">
<p id="752">C:\Siemens\Automation\WinCC_OA\3.19\data\NGA\InfluxDB\sql&gt;restoreInfluxDB.cmd --help</p>
</blockquote>
<pre><code id="753">Usage: restoreInfluxDb.cmd [\&lt;command\&gt; \&lt;argument\&gt;] \&lt;WinCC-OA-project-name\&gt; \&lt;InfluxDB-backup-path\&gt;

The commands are:

\--database The name of the database (default is &quot;winccoa&quot;)

\--host Host and port of the database (default is &quot;127.0.0.1:8088&quot;)

\--backup The backup folder name (e.g. 20211021-133236) inside \&lt;InfluxDB-backup-path\&gt; (default is the newest backup)

\--password The password for the InfluxDB authentication, no further password prompt is shown

(only ASCII characters are allowed in passwords when using this command)

\--username The username for the InfluxDB authentication, no further username input prompt is shown

(only ASCII characters are allowed in username when using this command)

\--silent The user will not be asked to confirm that the current database will be overwritten

(This command is a switch and needs no argument)

\--timeout The timeout after the influxd restore operation (default is 10 seconds)
</code></pre>
<p id="778">举例：</p>
<blockquote id="780">
<p id="780">C:\Siemens\Automation\WinCC_OA\3.19\data\NGA\InfluxDB\sql&gt;restoreInfluxDB.cmd FMCS_MEP_DEMO d:\influxdb_backup</p>
<p id="782">The database &quot;winccoa&quot; has to be dropped from InfluxDB before restoring from d:\influxdb_backup. All data in &quot;winccoa&quot; will be lost!</p>
<p id="784">Do you want to continue [y/n]? y</p>
<p id="786">Username: etm</p>
<p id="788">Password: *******(密码etm#123)</p>
<p id="790">Starting up influxd -config C:\WinCC_OA_Proj\FMCS_MEP_DEMO\config\influxdb.conf</p>
<p id="792">Dropped database &quot;winccoa&quot; from InfluxDB</p>
<p id="794">Restoring database &quot;winccoa&quot; from backup 20230715-003337</p>
<p id="796">2023/07/15 00:39:30 Restoring shard 44 live from backup 20230714T163337Z.s44.tar.gz</p>
<p id="798">2023/07/15 00:39:30 Restoring shard 8 live from backup 20230714T163337Z.s8.tar.gz</p>
</blockquote>
<h3 id="800">7.3 数据库界面管理</h3>
<p id="802"><img src="source/media/a11862f71a93bd646e6dc028bc34708e.png" alt="" /></p>
<blockquote id="804">
<p id="804">1的位置，找到DB，DB_2,DB_R,DB_R_2,四个本机历史库的参数，</p>
<p id="806">2的位置，填写</p>
<p id="808">Database wincc_oa</p>
<p id="810">backupPath 空（空的意思是默认存储到&lt;projdir&gt;/db/wincc_oa/influx/backup）</p>
<p id="812">backupHostConnectionString 127.0.0.1:8088</p>
<p id="814">backupHostConnectionString是influxdb的config文件中全局参数bind-address=&quot;:8088&quot;定义的。</p>
</blockquote>
<p id="816">中央历史库的参数界面</p>
<p id="818"><img src="source/media/ae36021b26a7c461571e05504bd49a71.png" alt="" /></p>
<blockquote id="820">
<p id="820">在1 的位置，找到中央历史库HIS,HIS_2,HIS_R,HIS_R_2，</p>
<p id="822">在2的位置，填写如下参数：</p>
<p id="824">database winccoa</p>
<p id="826">backupPath C:/influx/db2/backup</p>
<p id="828">influxBinPath C:/Siemens/Automation/WinCC_OA/3.17/bin</p>
<p id="830">dpNameFilterSplitSize 100</p>
<p id="832">backupHostConnectionString H5:9088</p>
<p id="834">databaseStartupTimeout 2</p>
<p id="836">其中，backupPath指的是将中央历史库的数据，存储到本地硬盘的路径。</p>
<p id="838">InfluxBinPath指向本地的influxd程序</p>
<p id="840">backupHostConnectionString是中央历史库的连接符。本例中的中央库的influx的conf配置文件中应当为：bind-address=&quot;:9088&quot;</p>
</blockquote>
<h3 id="842">7.4 历史归档操作界面</h3>
<p id="844"><img src="source/media/c74bb02659a495c1feb9d3b4f6574597.png" alt="" /></p>
<blockquote id="846">
<p id="846">1的位置选择本地（或中央）的历史归档组。</p>
<p id="848">2 的位置选择时间段</p>
<p id="850">3 的位置点击备份按钮，即可自动调用备份程序进行备份。</p>
</blockquote>
<p id="852">同时，在备份路径下，可以观察自动生成的一系列备份历史库的文件。</p>
<p id="854"><img src="source/media/95b7b0523455dbbb07b0a61992ec8bcc.png" alt="" /></p>
<p id="856">1的位置观察，已经变化为状态“在线和备份”</p>
<p id="858"><img src="source/media/71afd7ecff8e4d469461d629fe3f4b49.png" alt="" /></p>
<p id="860">在备份路径下，已经生成了对应的归档组的备份文件。</p>
<p id="862">备注：备份文件夹的内容可以直接手工删除，此时，归档组的状态又会变化为“在线”。</p>
<p id="864">如果点击删除按钮，将会删除中央历史库实时在线的历史库。</p>
<p id="866"><img src="source/media/321314b443e2e6d294d4262188e39772.png" alt="" /></p>
<p id="868">点击offline and backed-up（离线并已经备份），可以对备份的历史再次恢复</p>
<h2 id="870">8 系统运维与诊断（Windows系统、influxDB数据库）</h2>
<p id="872">针对主机（或备机）安装influxDB（8086）历史库运行influxDB的情况。</p>
<p id="874">下载三件套：</p>
<ul id="876">
<li id="876"><a href="https://github.com/influxdata/influxdb/releases">https://github.com/influxdata/influxdb/releases</a></li>
<li id="877"><a href="https://github.com/influxdata/telegraf/releases">https://github.com/influxdata/telegraf/releases</a></li>
<li id="878"><a href="https://github.com/influxdata/chronograf/releases">https://github.com/influxdata/chronograf/releases</a></li>
</ul>
<p id="880">例如版本：</p>
<ul id="882">
<li id="882">chronograf-1.10.1_windows_amd64.zip</li>
<li id="883">influxdb-1.8.10_windows_amd64.zip</li>
<li id="884">telegraf-1.28.2_windows_amd64.zip</li>
</ul>
<h3 id="886">8.1 安装telegraf</h3>
<p id="888">[windows]</p>
<p id="890"><strong>生成telegraf config配置文件</strong></p>
<blockquote id="892">
<p id="892">telegraf --input-filter system:mem:swap:disk:diskio:nstat:cpu:processes:kernel:filesystem:influxdb --output-filter influxdb config &gt; telegraf.conf</p>
</blockquote>
<p id="894">修改生成的配置文件。</p>
<p id="896">或者直接用附件的配置文件：<code>telegraf.conf</code></p>
<p id="898">测试</p>
<blockquote id="900">
<p id="900">telegraf -config &quot;C:\software\telegraf\telegraf.conf&quot;</p>
</blockquote>
<p id="902"><strong>安装windows开机服务</strong></p>
<blockquote id="904">
<p id="904">telegraf --service install --config &quot;C:\software\telegraf\telegraf.conf&quot;</p>
<p id="906">telegraf.exe --service install #安装服务</p>
<p id="908">telegraf.exe --service uninstall #删除服务</p>
<p id="910">telegraf.exe --service start #启动服务</p>
<p id="912">telegraf.exe --service stop</p>
</blockquote>
<p id="914"><strong>安装 chronograf</strong></p>
<blockquote id="916">
<p id="916">nssm install chronograf</p>
</blockquote>
<p id="918">填写必要的参数，注册成功名为<code>chronograf</code>的windows服务。</p>
<p id="920">在服务中，找到<code>chronograf</code>，启动。</p>
<p id="922">用浏览器<code>http://&lt;INFLUXDB_SVR&gt;:8888</code> 进行访问</p>
<p id="924">配置chronograf 的 dashboard</p>
<p id="926">配置influxdb的连接</p>
<ul id="928">
<li id="928">1. 新建数据源，填写LOCAL8086, 代表主机INFLUXDB_SVR,开放端口8086的influxDB，诊断（主）服务器信息。</li>
<li id="929">2. 》仪表盘》导入dashboard》导入json文件》 Windows系统.json，实现对CPU , 内存，网络等基本信息诊断；</li>
<li id="930">3. 》仪表盘》导入dashboard》导入json文件》 InfluxDB.json，实现对influxDB运行参数基本信息诊断；</li>
</ul>
<p id="932">局域网使用<code>http://&lt;INFLUXDB_SVR&gt;:8888</code> 进行访问。</p>
<h2 id="934">9 系统运维与诊断（Linux系统、influxDB历史数据库）</h2>
<p id="936">针对同一个主机安装两个端口（8086，9086）两台历史库同时运行influxDB的情况。</p>
<p id="938">下载三件套：</p>
<blockquote id="939">
<p id="940"><a href="https://github.com/influxdata/influxdb/releases">https://github.com/influxdata/influxdb/releases</a></p>
<p id="942"><a href="https://github.com/influxdata/telegraf/releases">https://github.com/influxdata/telegraf/releases</a></p>
<p id="944"><a href="https://github.com/influxdata/chronograf/releases">https://github.com/influxdata/chronograf/releases</a></p>
</blockquote>
<p id="946">例如版本：</p>
<ul id="948">
<li id="948">influxdb-1.8.10.x86_64.rpm</li>
<li id="949">telegraf-1.28.1-1.x86_64.rpm</li>
<li id="950">chronograf-1.10.1.x86_64.rpm</li>
</ul>
<p id="952">安装telegraf</p>
<pre><code id="953">[windows]

scp telegraf\*.rpm chronograf\*.rpm chronograf\*.rpm root@\&lt;INFLUXDB_SVR\&gt;:/opt
</code></pre>
<pre><code id="958">[Linux]

su - root

# 修改执行权限：

chmod 755 /etc/rc.d/rc.local

# 安装telegraf

dnf install /opt/telegraf\*.rpm

# 生成config配置文件

telegraf --input-filter system:mem:swap:disk:diskio:nstat:snmp:cpu:processes:kernel:interrupts:linux_sysctl_fs:filesystem:influxdb --output-filter influxdb config \&gt; telegraf.conf

# 修改生成的配置文件。

# 或者直接用附件的配置文件：telegraf.conf

# 将配置文件拷贝到/etc/telegraf/telegraf.conf

# 生成服务telegraf.service

rm -rf /lib/systemd/system/telegraf.service

touch /lib/systemd/system/telegraf.service

echo [Unit] \&gt;\&gt; /lib/systemd/system/telegraf.service

echo Description=Telegraf Service \&gt;\&gt; /lib/systemd/system/telegraf.service

echo After=multi-user.target \&gt;\&gt; /lib/systemd/system/telegraf.service

echo [Service] \&gt;\&gt; /lib/systemd/system/telegraf.service

echo WorkingDirectory=/opt \&gt;\&gt; /lib/systemd/system/telegraf.service

echo User=root \&gt;\&gt; /lib/systemd/system/telegraf.service

echo Type=idle \&gt;\&gt; /lib/systemd/system/telegraf.service

echo ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf.conf \&gt;\&gt; /lib/systemd/system/telegraf.service

echo Restart=always \&gt;\&gt; /lib/systemd/system/telegraf.service

echo [Install] \&gt;\&gt; /lib/systemd/system/telegraf.service

echo WantedBy=multi-user.target \&gt;\&gt; /lib/systemd/system/telegraf.service

# 启动telegraf

systemctl daemon-reload

systemctl enable telegraf.service

systemctl start telegraf.service

systemctl status telegraf.service

# 重启

systemctl restart telegraf.service

systemctl status telegraf.service

# 创建用户与数据库

influx -host localhost -port 8086 -execute &quot;CREATE DATABASE telegraf&quot;

influx -host localhost -port 8086 -execute &quot;CREATE USER &quot;telegraf&quot; WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES&quot;

influx -host localhost -port 9086 -execute &quot;CREATE DATABASE telegraf&quot;

influx -host localhost -port 9086 -execute &quot;CREATE USER &quot;telegraf&quot; WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES&quot;

influx -host localhost -port 8086 -execute &quot;CREATE DATABASE winccoa&quot;

influx -host localhost -port 8086 -execute &quot;CREATE USER &quot;etm&quot; WITH PASSWORD 'etm\#123' WITH ALL PRIVILEGES&quot;

influx -host localhost -port 9086 -execute &quot;CREATE DATABASE winccoa&quot;

influx -host localhost -port 9086 -execute &quot;CREATE USER &quot;etm&quot; WITH PASSWORD 'etm\#123' WITH ALL PRIVILEGES&quot;

# 安装 chronograf

dnf install /opt/chronograf\*.x86_64.rpm

chronograf

systemctl daemon-reload

systemctl enable chronograf.service

systemctl start chronograf.service

systemctl status chronograf.service

# 重启

systemctl restart chronograf.service

systemctl status chronograf.service

</code></pre>
<p id="1064">用浏览器<code>http://&lt;INFLUXDB_SVR&gt;:8888</code> 进行访问</p>
<p id="1066">配置chronograf 的 dashboard</p>
<p id="1068">配置influxdb的连接</p>
<blockquote id="1070">
<p id="1070">1. 新建数据源，填写LOCAL8086, 代表主机INFLUXDB_SVR,开放端口8086的influxDB，诊断（主）服务器信息。</p>
<p id="1072">2. 仪表盘导入dashboard》导入json文件》 Linux系统.json，实现对CPU , 内存，网络等基本信息诊断；</p>
<p id="1074">3.仪表盘导入dashboard》导入json文件》 InfluxDB.json，实现对influxDB运行参数基本信息诊断；</p>
</blockquote>
<p id="1076">局域网使用<code>http://&lt;INFLUXDB_SVR&gt;:8888</code> 进行访问。</p>
<h2 id="1078">10 influxDB Rest API直接访问历史数据库</h2>
<p id="1080">sql语句格式</p>
<div id="1081" class="lang-sql editor-colors"><div class="sql"><pre>

<span class="keyword">SELECT</span> 语法：

<span class="keyword">SELECT</span> \&lt;field_key\&gt;[,\&lt;field_key\&gt;,\&lt;tag_key\&gt;]

<span class="keyword">FROM</span> \&lt;database_name\&gt;.\&lt;retention_policy_name\&gt;.\&lt;measurement_name\&gt;

<span class="keyword">WHERE</span> \&lt;conditional_expression\&gt; [(AND\|OR) \&lt;conditional_expression\&gt; [...]]

<span class="keyword">GROUP</span> <span class="keyword">BY</span> <span class="keyword">time</span>(\&lt;time_interval\&gt;),[tag_key] [fill(\&lt;fill_option\&gt;)]

<span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="keyword">time</span> [asc \| desc]

fill()

LIMIT number

SLIMIT N

OFFSET number

tz(<span class="string">&#39;\&lt;time_zone\&gt;&#39;</span>)
</pre></div>
</div>
<p id="1106">解释：</p>
<p id="1108"><code>SELECT</code>后面查询显示字段必须至少有一个field key，否则会抛异常ERR: at least 1 non-time field must be queried。还可显示tag keys、time，或者*显示所有字段。支持类型转换算符::,如：::float</p>
<p id="1110"><code>FROM</code> 返回完全合格测量的数据。通过指定度量的数据库和保留策略来完全限定度量。</p>
<p id="1112"><code>WHERE</code> 查询条件可为tag keys和time，field keys 也可作为查询条件但是不常用，因为不是索引，查询效率比较低。tag keys条件操作符支持=、!=、&lt;&gt;、正则，field keys支持=、!=、&lt;&gt;、&gt;、&gt;=、&lt;、&lt;=、正则。<em>Tag key 用双引号，字符串用单引号。</em></p>
<p id="1114"><code>GROUP BY</code>只能对tag keys和time进行合分组，可以多字段排序，如group by tag1,tag2,time，也可一个*对所有的tag进行分组聚合,支持time时间分组聚合（前提是对SELECT 使用统计函数进行检索）。time(0 函数支持的单位：&quot;ns&quot; | &quot;u&quot; | &quot;µ&quot; | &quot;ms&quot; | &quot;s&quot; | &quot;m&quot; | &quot;h&quot; | &quot;d&quot; | &quot;w&quot;。</p>
<p id="1116"><code>Fill() </code>如果values结果集中有null的情况，可在查询语句中加fill(0)，遇到null用0来填充。fill()中只能填数字和previous（用前值替代）。</p>
<p id="1118"><code>ORDER BY</code>只能对time进行排序，asc升序，desc降序。</p>
<p id="1120"><code>LIMIT</code>分页，LIMIT后面的数字是查询显示多少条，</p>
<p id="1122"><code>SLIMIT</code> &lt;N&gt; , SLIMIT &lt;N&gt;返回指定测量值中 &lt;N&gt; 系列中的每个点。</p>
<p id="1124"><code>OFFSET</code>后面数字代表偏移量（从0开始代表第一条），如limit 10 offset 10意思为从第11条开始往后10条。</p>
<p id="1126"><code>tz</code>('&lt;time_zone&gt;') 指定时区(仅Linux)</p>
<p id="1128">举例：</p>
<div id="1130" class="lang-sql editor-colors"><div class="sql"><pre>

<span class="keyword">SELECT</span> original_value_float 
<span class="keyword">FROM</span> AI_FAST.AI_FAST 
<span class="keyword">WHERE</span> <span class="string">&quot;name&quot;</span> = <span class="string">&#39;MEP:F1_CUB_1_1_102_XF_TIT01.STATE.VAL_IN.VALUE&#39;</span> 
<span class="keyword">AND</span> <span class="keyword">time</span> \&gt; <span class="string">&#39;2023-07-14T15:00:00Z&#39;</span> 
<span class="keyword">AND</span> <span class="keyword">time</span>\&lt;<span class="string">&#39;2023-07-14T20:00:00Z&#39;</span>
</pre></div>
</div>
<p id="1138">python访问历史库</p>
<div id="1140" class="lang-js editor-colors"><div class="javascript"><pre>
<span class="keyword">import</span> requests  
  
# 定义InfluxDB的主机和端口  
influx_host = <span class="string">&#39;aigowifi&#39;</span>  
influx_port = <span class="string">&#39;8086&#39;</span>  
  
# 定义数据库名称和测量名称  
database_name = <span class="string">&#39;winccoa&#39;</span>  
measurement_name = <span class="string">&#39;AI_FAST.AI_FAST&#39;</span>  
field = <span class="string">&#39;original_value_float&#39;</span>
# 定义用户名和密码  
username = <span class="string">&#39;etm&#39;</span>  
password = <span class="string">&#39;etm#123&#39;</span>  
dpe=<span class="string">&#39;MEP:F1_CUB_1_1_102_XF_TIT01.STATE.VAL_IN.VALUE&#39;</span>
t0=<span class="string">&#39;2023-07-14T15:00:00Z&#39;</span>
t1=<span class="string">&#39;2023-07-14T20:00:00Z&#39;</span>
# 构建查询语句  
url = f<span class="string">&quot;http://{influx_host}:{influx_port}/query&quot;</span>  
query = f<span class="string">&quot;SELECT {field} FROM {measurement_name} WHERE \&quot;</span>name\<span class="string">&quot; = &#39;{dpe}&#39; AND time &gt; &#39;{t0}&#39; AND time&lt;&#39;{t1}&#39;&quot;</span>  
# 发送HTTP请求并获取响应  
response = requests.get(url, params={<span class="string">&#39;q&#39;</span>: query, <span class="string">&#39;db&#39;</span>: database_name}, auth=(username, password))  
  
# 检查响应状态码，并解析JSON数据  
<span class="keyword">if</span> response.status_code == 200:
    data = response.json()  
    # 打印结果  
    print(data) 
    print(query)  
<span class="keyword">else</span>:
    print(f<span class="string">&quot;Error: {query},{response.text}&quot;</span>)

</pre></div>
</div>
<p id="1174">示例程序在<code>&lt;LIB319&gt;/data/webservice/winccoa.py</code></p>
<p id="1176">curl命令访问</p>
<pre><code id="1178">curl -G  
&quot;localhost:8086/query?db=winccoa&quot; 
--user etm:etm#123 
--data-urlencode 
&quot;q= SELECT original_value_float 
	FROM AI_FAST.AI_FAST 
	WHERE \&quot;name\&quot; = 'MEP:F1_CUB_1_1_102_XF_TIT01.STATE.VAL_IN.VALUE' 
	AND time &gt; '2023-07-14T15:00:00Z' 
	AND time&lt;'2023-07-14T20:00:00Z' 
	LIMIT 10&quot;
</code></pre>
<p id="1191">Javascript访问</p>
<div id="1192" class="lang-html editor-colors"><div class="html"><pre>
<span class="htmlTagDelimiter">&lt;!</span><span class="htmlElementName">DOCTYPE</span> <span class="htmlAttributeName">html</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">html</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">head</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">meta</span> <span class="htmlAttributeName">charset</span><span class="htmlOperator">=</span><span class="htmlAttributeValue">&quot;utf-8&quot;</span><span class="htmlTagDelimiter">&gt;</span> 
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">title</span><span class="htmlTagDelimiter">&gt;</span>WinCC OA influxDB RestAPI For jQuery<span class="htmlTagDelimiter">&lt;/</span><span class="htmlElementName">title</span><span class="htmlTagDelimiter">&gt;</span> 
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">script</span> <span class="htmlAttributeName">src</span><span class="htmlOperator">=</span><span class="htmlAttributeValue">&quot;https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js&quot;</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;/</span><span class="htmlElementName">script</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;/</span><span class="htmlElementName">head</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;</span><span class="htmlElementName">script</span><span class="htmlTagDelimiter">&gt;</span>
$(document).ready(<span class="keyword">function</span>() {  
  <span class="comment">// 指定 InfluxDB 的 RestAPI 地址  </span>
  <span class="keyword">var</span> influxdbUrl = <span class="string">&#39;http://localhost:8086/query&#39;</span>;  
  <span class="comment">// 用户名和密码  </span>
  <span class="keyword">var</span> username = <span class="string">&#39;etm&#39;</span>;  
  <span class="keyword">var</span> password = <span class="string">&#39;etm#123&#39;</span>;  
  
  <span class="comment">// 构建查询语句,注意每行最后有个空格！</span>
  <span class="comment">// 注意：读出的数据都是UTC时间，请自行转换成LOCAL的时间（+8）</span>
  <span class="keyword">var</span> query = `SELECT time AS \<span class="string">&quot;时间\&quot;</span>, 
		first(\<span class="string">&quot;original_value_float\&quot;</span>) AS \<span class="string">&quot;CUB_1_1_102_XF_TIT01消防泵房温度检测\&quot;</span> 
		FROM AI_FAST.AI_FAST 
		WHERE \<span class="string">&quot;name\&quot;</span> = <span class="string">&#39;MEP:F1_CUB_1_1_102_XF_TIT01.STATE.VAL_IN.VALUE&#39;</span> 
		AND time &gt;= <span class="string">&#39;2023-07-15T02:00:00Z&#39;</span> 
		AND time &lt;= now() - 1h
		GROUP BY time(1m) 
		FILL(previous) 
		ORDER BY time DESC 
		LIMIT 1000 
		SLIMIT 1`; 
  
   <span class="comment">// 发送 GET 请求进行验证  </span>
  $.ajax({  
    url: influxdbUrl,
    type: <span class="string">&#39;GET&#39;</span>,  
    data: {  
      q: query,  
	  db:<span class="string">&#39;winccoa&#39;</span>,
      u: username,  
      p: password 
    },  
    success: <span class="keyword">function</span>(response) {  
      <span class="comment">// 处理成功返回的数据  </span>
      console.log(response);  
    },  
    error: <span class="keyword">function</span>(xhr, status, error) {  
      <span class="comment">// 处理请求失败的情况  </span>
      console.log(<span class="string">&#39;Error: &#39;</span> + error);  
      console.log(<span class="string">&#39;query: &#39;</span> + query);  
    }  
  });  
});
<span class="htmlTagDelimiter">&lt;/</span><span class="htmlElementName">script</span><span class="htmlTagDelimiter">&gt;</span>
<span class="htmlTagDelimiter">&lt;/</span><span class="htmlElementName">html</span><span class="htmlTagDelimiter">&gt;</span>
</pre></div>
</div>
<p id="1248">执行结果：</p>
<p id="1250"><img src="source/media/693266606e187aa484d41512b6903453.png" alt="" /></p>
<p id="1252">示例程序在<code>&lt;LIB319&gt;/data/webservice/index.html</code></p>
<h2 id="1254">11 其他</h2>
<h3 id="1256">11.1 报警声音</h3>
<p id="1258"><img src="source/media/85d8a8f8b14e25659f5280b6adb952c2.png" alt="" /></p>
<p id="1260">在运行后的画面点击语音管理。</p>
<blockquote id="1262">
<p id="1262">1的位置激活Cortana语音助理（支持LTSC版本Windows）.</p>
<p id="1264">6的位置输入系统名称的汉字。如洁净室系统。</p>
<p id="1266">2的位置激活报警弹窗功能。</p>
<p id="1268">3的位置选择报警条。</p>
<p id="1270">4的位置选择三级报警（40）及以上。</p>
<p id="1272">5的位置选择播放的声音文件。</p>
</blockquote>
<p id="1274">应用并关闭。</p>
<p id="1276">不显示内部报警</p>
<p id="1278"><img src="source/media/b0e2b6b7fbf99eea95ee1878cfe81c2b.png" alt="" /></p>
<p id="1280">去除1，2，3的勾选。保存。</p>

                </body>
            </html>
            